03-13-24 (Wednesday)

VERSE 1:
We bring our time, we bring our treasure,
we lay them down before Your throne.
You will make them something greater,
more than we could ever know. (chorus)

VERSE 2:
We bring our gifts, we bring our power
place them in Your sov’reign hand.
You will take what we have given,
You will use it for Your plan. (chorus)

CHORUS:
Glory be to God, the Maker
glory be to God, Creator
Take our time, use our treasure
turn them into something greater:
Glory be to God, the Maker.

VERSE 3:
Though our hearts are weak from failure,
broken dreams and failed attempts,
show us that in ev’ry season,
You will fill our emptiness. (chorus)
(God the Maker, The Porter’s Gate)

1 Techniques and patterns with dictionaries

1.1 Methods

From Python Documentation:

  • Take a look at methods you may find useful and note them down. here. Try to “play around” with them later.

1.2 Constructors

  • There are many ways to construct a dictionary.
tel = {'jack': 4098, 'sape': 4139}
tel = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
tel = dict(sape=4139, guido=4127, jack=4098)
  • You can even use dictionary comprehensions. What will be the resulting dictionary in the following program?
goals = {name : {x: 0 for x in range(1990,2023)} for name in ['Ronaldo', 'Rivaldo', 'Neymar']}

1.3 Nesting dictionaries example: XML files

  • The following code uses the requests module to download a XML file, and the ElementTree class to parse it into nested dictionaries.
  • The XML file was generated by the BoardGameGeek website and contains your professor’s board game collection. :D
import requests
import xml.etree.ElementTree as ET

# URL of the XML file
url = "https://cs.calvin.edu/courses/cs/108/fsantos/units/08/activities/bgg_collection.xml"

# Send a GET request to the URL to retrieve the XML content
response = requests.get(url)

# Check if the request was successful
if response.status_code == 200:
    # Parse the XML content
    xml_content = response.content
    root = ET.fromstring(xml_content)

    collection = {}
    # Process the XML data
    for item in root:
      gamename = item.find('name').text # get the game name
    
      game = {}.copy() # construct the dictionary with the game's attributes
      collection[gamename] = game
    
      game['year'] = item.find('yearpublished').text
      game['stats'] = item.find('stats').attrib
  • Note: XML is a very common data interchange format. Its main advantage is being application and language independent. You can check some basics here.

1.4 Looping through dictionaries

  • Try to run the code in your machine and now write some code to loop through all the names and stats of the games. Make it a function!
  • For example:
for game, value in collection.items():
  print(game+': ')
  for att, v in value.items():
    print(att, v)
  print()
  • Try to remove some games from this dictionary collection using the del statement. You can even use a loop:
for game in ['Abstratus', 'Agricola', 'Whale Riders']:
  del collection[game]

2 Sets

  • A set is an unordered collection with no duplicate elements.
  • Curly braces or the set() function can be used to create sets.
  • Important: to create an empty set you have to use set(), not {}; the latter creates an empty dictionary!

2.1 Use example: find unique elements

a = "banana"
unique = set(a)
print(unique) # all the letters used in the string 'banana'
{'a', 'b', 'n'}
  • Later, for example, you may want to use this set as the keys for a dictionary counting the number of occurrences.
occurrences = {u:0 for u in unique}
for character in a:
  occurrences[character] += 1
print(occurrences)
{'a': 3, 'b': 1, 'n': 2}

2.2 Use example: set operations

  • Another application of sets is to perform mathematical operations such as union, intersection, difference, and symmetric difference. These operations can be useful in various scenarios, such as data analysis, where you need to combine or compare sets of data.

  • Suppose my wife and I had two book collections before getting married. Then…
fernando = {"The Lord of the Rings", "Out of the Silent Planet", "The Chronicles of Narnia", "The Silmarillion"}
jemima = {"Harry Potter", "Pride and Prejudice", "The Lord of the Rings", "The Chronicles of Narnia", "The Hobbit"}

all_books = fernando.union(jemima)
print("All Books:", all_books)
All Books: {'The Silmarillion', 'Harry Potter', 'Out of the Silent Planet', 'The Hobbit', 'The Chronicles of Narnia', 'The Lord of the Rings', 'Pride and Prejudice'}
  • But let’s suppose we also want to compare our collections:
# Union of the two sets (books that we both have)
common_books = fernando.intersection(jemima)
print("Common books:", common_books)

# Difference between the two sets (books that Fernando has and Jemima doesn't)
unique_to_fernando = fernando.difference(jemima) # OR: fernando - jemima
print("Books unique to Fernando:", unique_to_fernando)

# Symmetric difference (books that either Fernando has or Jemima has)
unique_books = fernando.symmetric_difference(jemima)
print("Unique books in both collections:", unique_books)
Common books: {'The Lord of the Rings', 'The Chronicles of Narnia'}
Books unique to Fernando: {'The Silmarillion', 'Out of the Silent Planet'}
Unique books in both collections: {'The Silmarillion', 'Pride and Prejudice', 'Out of the Silent Planet', 'Harry Potter', 'The Hobbit'}

2.3 Set methods

  • All the methods you can use with sets can be found in the documentation.

  • You can also use set comprehensions. For example, what’s the output of the following code?

a = {x for x in 'abracadabra' if x not in 'abc'}

3 Free, libre and open source software

  • The source code of proprietary software may typically not be modified or redistributed without express consent.
  • However, Free, Libre and Open Source Software (FLOSS) is software whose source code may be modified and redistributed. Anyone is allowed to view, modify, and contribute to the development.
    • “Libre” is a term often used in the open-source community to emphasize the freedom to use, study, modify, and distribute software. This is in contrast to “gratis,” which simply means “free of charge.”

It can be useful to distinguish between four levels of free software:

  • FREEDOM 0: freedom to run the program as you wish, for any purpose.

  • FREEDOM 1: freedom to study how the program works, and change it so it does your computing as you wish. Access to the source code is a precondition for this.

  • FREEDOM 2: freedom to redistribute copies so you can help others.

  • FREEDOM 3: freedom to distribute copies of your modified versions to others. By doing this you can give the whole community a chance to benefit from your changes.

  • There are many kinds and standards of open software licenses.

    • GNU General Public License (GPL): One of the most widely used open-source licenses, the GPL requires that any derivative work also be licensed under the GPL. It originated with Richard Stallman, one of the father os FLOSS, and it forbids any modification of the code to be directly used in a proprietary product. Advocates of this stance often reject the term “open source,” which dates to early 1998, and use Stallman’s original “free software,” because copyleft licenses are to protect the freedom of the developer and all future users to do whatever they want with the software.
    • MIT License: A very permissive license that allows for almost unrestricted use of the software, including commercial use, as long as the original copyright notice and disclaimer are included in all copies or substantial portions of the software.
    • Apache License,
    • BSD License,
    • Mozilla Public License,
    • Creative Commons License, etc.

3.1 The social aspect: FLOSS enables community

What is good: - Principles of collaboration, transparency, and community-driven development. It creates a community of practice, of people doing something beautiful together. - Terms commonly used: peer production, mass collaboration, wikinomics, open innovation, crowdsourcing, collaborative consumption.

“Becoming charitable contributors to such communities is one of the most powerful places Christians can be witnesses in the digital age; because of the distributed nature of OSS development, they can rise to positions of real influence and respect, and cause others to do likewise.” - Karl Dieter Crisman, Open Source Software and Christian Thought

Problems and challenges: - Community vices: OSS communities can be exclusive or even hostile to those new to it, to members with a different licensing philosophy, or to those who transgress unwritten norms. Some projects can at least be perceived as uniting against the common foe of a particular computer company. - Also, it can foster unhealthy competitiveness and struggle for recognition in the community.

3.2 The economic aspect: FLOSS enables stewardship

What is good: - It is free! And then it can help the underpriviledged by giving access to something. - Thus, it can be an attitude of self-giving and stewardship. - Some people notice that “software is an “antirival” good. Not only does the value of software not diminish if more people use it, including freeloaders (as opposed to the “tragedy of the commons”), but its value may also increase with additional users—for example, when they contribute bug reports or other suggestions.”

Problems and challenges: - It can precarize and invisibilize work that should be rewarded (Ivan Illich’s “shadow work”). - It may become a drug, creating dependency in other areas.

3.3 The juridical aspect: FLOSS enables freedom

What is good: - It can subvert authorities and offer different approaches to computer software solutions.

Problems and challenges: - It is often put under a libertarian ideal of free thought and free speech that could culminate in social anarchy.

3.4 The aesthetic aspect: FLOSS enables play and creativity

What is good: - Freedom from economic restraints permits an aesthetic and playful approach to developing something. We are not doing just for money or recognition, but for the sake of doing something nice (“internal good”, in contrast to an “external good”).

Problems and challenges: - At the same time, it can become irrelevant, too extravagant and not really attentive to what is most needed.


  • What are other points you think might be important to be called attention?
  • How can we, as Christians, help and propose better dynamics for software development? How can we affirm, critique and enrich this discussion?